package 炫彩窗口基类

import (
	xc "gitee.com/go_888/xcgui/xcgui/xc"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
	"math/rand"
	"time"
)

// X结构_托盘 封装且简化了对托盘图标的操作. 更多操作可使用 xc.XTrayIcon_ 系列函数.
type X结构_托盘 struct {
	X图标句柄   uintptr // 图标句柄. 仅用于记录.
	X窗口句柄 int     // 炫彩窗口句柄. 仅用于记录.
	X提示文本    string  // 提示文本. 仅用于记录.
	Id标识符      int32   // 托盘图标唯一标识符, 会传到托盘事件的第一个参数里. 仅用于记录.
	X结果  bool    // 由于采用了链式调用的写法, 所以在这里判断函数是否执行成功. 或者在链式调用后使用 IsOk 函数来判断.
}

// 用于记录已有的托盘图标标识符.
var ids []int32

// NewTrayIcon 创建托盘图标对象. 之后需调用 Show 函数来显示到托盘.
//
// hWindow: 炫彩窗口句柄.
//
// hIcon: 图标句柄. 可使用 wutil.HIcon 函数生成.
//
// tips: 提示文本, 长度不能超过 127 个字符.
func X创建托盘图标(窗口句柄 int, 图标句柄 uintptr, 提示 string) *X结构_托盘 {
	xc.X托盘图标_设置图标(图标句柄)
	xc.X托盘图标_设置提示文本(提示)

	rand.Seed(time.Now().UnixNano())
	var id int32
	for {
		id = rand.Int31()
		if id != 0 && sliceIndexOf(ids, id) == -1 { // 不等于0且不是已有的
			ids = append(ids, id)
			break
		}
	}
	return &X结构_托盘{X窗口句柄: 窗口句柄, X图标句柄: 图标句柄, X结果: true, Id标识符: id}
}

// IsOk 用于判断上一个函数是否执行成功, 因为采用了链式调用的写法.
func (t *X结构_托盘) X是否执行成功() bool {
	return t.X结果
}

// Show 托盘图标_显示. 从系统托盘显示或隐藏图标.
//
// isShow: 是否显示. 内部原理如下:
//   - true: 执行 xc.XTrayIcon_Add().
//   - false: 执行 xc.XTrayIcon_Del().
func (t *X结构_托盘) X显示(是否显示 bool) *X结构_托盘 {
	if 是否显示 {
		t.X结果 = xc.X托盘图标_添加(t.X窗口句柄, t.Id标识符)
	} else {
		t.X结果 = xc.X托盘图标_删除()
	}
	return t
}

// Del 托盘图标_删除. 从系统托盘删除图标. 等同于 Show(false).
func (t *X结构_托盘) Del() *X结构_托盘 {
	t.X结果 = xc.X托盘图标_删除()
	return t
}

// Modify 托盘图标_修改. 应用对于托盘图标的修改.
func (t *X结构_托盘) X执行修改() *X结构_托盘 {
	t.X结果 = xc.X托盘图标_修改()
	return t
}

// SetFocus 托盘图标_置焦点. 将焦点设置回系统托盘.
func (t *X结构_托盘) X设置焦点() *X结构_托盘 {
	t.X结果 = xc.X托盘图标_设置焦点()
	return t
}

// SetIcon 托盘图标_置图标. 之后需调用 Modify 函数以应用修改.
//
// hIcon: 图标句柄. 可使用 wutil.HIcon 函数生成.
func (t *X结构_托盘) X设置图标(图标句柄 uintptr) *X结构_托盘 {
	xc.X托盘图标_设置图标(图标句柄)
	t.X图标句柄 = 图标句柄
	t.X结果 = true
	return t
}

// SetTips 托盘图标_置提示文本. 之后需调用 Modify 函数以应用修改.
//
// pTips: 提示文本内容, 长度不能超过 127 个字符.
func (t *X结构_托盘) X设置提示文本(文本 string) *X结构_托盘 {
	xc.X托盘图标_设置提示文本(文本)
	t.X提示文本 = 文本
	t.X结果 = true
	return t
}

// SetPopupBalloon 托盘图标_置弹出气泡. 设置弹出气泡信息. 之后需调用 Modify 函数以应用修改.
//
// pTitle: 弹出气泡标题.
//
// pText: 弹出气泡内容.
//
// hBalloonIcon: 气泡图标. 可填0.
//
// flags: 标识, 可设置默认图标类型, 禁用声音等: xcc.TrayIcon_Flag_
func (t *X结构_托盘) X设置弹出气泡(弹出气泡标题, 弹出气泡内容 string, 气泡图标 uintptr, 标识 xcc.X托盘图标标识) *X结构_托盘 {
	xc.X托盘图标_设置弹出气泡(弹出气泡标题, 弹出气泡内容, 气泡图标, 标识)
	t.X结果 = true
	return t
}

// Reset 托盘图标_重置. 重置数据, 当未添加到系统托盘状态才可调用.
//   - 注意: 并不是清除本对象中存储的信息, 也并没有释放图标句柄.
func (t *X结构_托盘) X重置() *X结构_托盘 {
	xc.X托盘图标_重置()
	t.X结果 = true
	return t
}

// 获取元素在slice中的索引, 找不到则返回-1.
func sliceIndexOf(slice []int32, element int32) int {
	for i := 0; i < len(slice); i++ {
		if slice[i] == element {
			return i
		}
	}
	return -1
}
